<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-GB" xml:lang="en-GB">
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="pandoc" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  <title>uihelpstate</title>
  <style>
  html {font-family: Hoefler Text, Palatino, Georgia, serif;
    color: #1a1a1a;
    background-color: #fdfdfd;}

  body {margin: 0 auto;
    max-width: 40em;
    padding-left: 15px;
    padding-right: 15px;
    padding-top: 5px;
    padding-bottom: 5px;
    hyphens: auto;
    overflow-wrap: break-word;
    text-rendering: optimizeLegibility;
    font-kerning: normal;
  }

  @media (max-width: 600px) {body {font-size: 0.9em;
    padding: 1em;}
    h1 {font-size: 1.8em;}
  }

  @media print {body {background-color: transparent;
    color: black;
    font-size: 12pt;}
    p, h2, h3 {	orphans: 3;
    widows: 3;}
    h2, h3, h4 {	page-break-after: avoid;}
  }

  header {display: none;}
  kbd {margin: 0px 0.1em;
    padding: 0.1em 0.6em;
    border-radius: 3px;
    border: 1px solid rgb(204, 204, 204);
    color: rgb(51, 51, 51);
    line-height: 1.4;
    font-family: Menlo, monospace;
    font-size: 11px;
    display: inline-block;
    box-shadow: 0px 1px 0px rgba(0,0,0,0.3);
    background-color: rgb(247, 247, 247);
    text-shadow: 0 1px 0 #fff;
  }
  kbd:hover {box-shadow: 0 1px 0 0.5px;}
  p {font-size: 18px;margin: 0.8em 0;line-height: 1.5;}
  a {color: #1a1a1a;}
  a:visited {color: #1a1a1a;}
  img {max-width: 100%;}
  h1, h2, h3, h4, h5, h6 {margin-top: 1.4em;}
  h5, h6 {font-size: 1em;
  font-style: italic;}
  h6 {font-weight: normal;}
  ol, ul {font-size: 18px;
    line-height: 1.2em;
    padding-left: 1.7em;
    margin-top: 1em;}
  li > ol, li > ul {margin-top: 0;}
  blockquote {margin: 1em 0 1em 1.7em;
    padding-left: 1em;
    border-left: 2px solid #e6e6e6;
    color: #606060;
    font-style: italic;}
  code {font-family: Fira Code, Menlo, Consolas, monospace;
    font-size: 14px;
    margin: 0;
    background-color: #F0F0F0;
    color:rgb(145, 16, 42);
  }
  pre {margin: 1em 0;
    overflow: auto;
  }
  pre code {padding: 0;
    overflow: visible;
    overflow-wrap: normal;
    background-color:transparent;
    color: black;
  }
  pre.smaller code {font-size: 60% !important; line-height: .75rem !important;}
  .sourceCode {background-color: transparent;
    overflow: visible;
  }
  hr {background-color: #1a1a1a;
    border: none;
    height: 1px;
    margin: 1em 0;
  }
  table {margin: 1em 0;
    border-collapse: collapse;
    width: 100%;
    overflow-x: auto;
    display: block;
    font-variant-numeric: lining-nums tabular-nums;
  }
  table caption {margin-bottom: 0.75em;}
  tbody {margin-top: 0.5em;
    border-top: 1px solid #1a1a1a;
    border-bottom: 1px solid #1a1a1a;
  }
  th {border-top: 1px solid #1a1a1a;
    padding: 0.25em 0.5em 0.25em 0.5em;
  }
  td {padding: 0.125em 0.5em 0.25em 0.5em;}
  header {margin-bottom: 4em;
    text-align: center;
  }
  #TOC li {list-style: none;}
  #TOC ul {padding-left: 1.3em;}
  #TOC > ul {padding-left: 0;}
  #TOC a:not(:hover) {text-decoration: none;}
  code{white-space: pre-wrap;}
  span.smallcaps{font-variant: small-caps;}
  span.underline{text-decoration: underline;}
  div.column{display: inline-block; vertical-align: top; width: 50%;}
  div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
  ul.task-list{list-style: none;}
  pre > code.sourceCode { white-space: pre; position: relative;}
  pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
  pre > code.sourceCode > span:empty { height: 1.2em; }
  .sourceCode { overflow: visible; }
  code.sourceCode > span { color: inherit; text-decoration: inherit; }
  div.sourceCode { margin: 2em 0; }
  pre.sourceCode { margin: 0; }
  @media screen {
  div.sourceCode { overflow: auto; background-color: #F0F0F0;}
  }
  @media print {
  pre > code.sourceCode { white-space: pre-wrap;}
  pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
  }
  pre.numberSource code
    { counter-reset: source-line 0; }
  pre.numberSource code > span
    { position: relative; left: -4em; counter-increment: source-line; }
  pre.numberSource code > span > a:first-child::before
    { content: counter(source-line);
      position: relative; left: -1em; text-align: right; vertical-align: baseline;
      border: none; display: inline-block;
      -webkit-touch-callout: none; -webkit-user-select: none;
      -khtml-user-select: none; -moz-user-select: none;
      -ms-user-select: none; user-select: none;
      padding: 0 4px; width: 4em;
      color: #aaaaaa;
    }
  pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
  @media screen {
  pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
  }
  code span.al { color: #ff0000; font-weight: bold; } /* Alert */
  code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
  code span.at { color: #7d9029; } /* Attribute */
  code span.bn { color: #40a070; } /* BaseN */
  code span.bu { color: #008000; } /* BuiltIn */
  code span.cf { color: #0044a3; font-weight: bold; } /* ControlFlow */
  code span.ch { color: #4070a0; } /* Char */
  code span.cn { color: #880000; } /* Constant */
  code span.co { color: #779097; font-style: italic; } /* Comment */
  code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
  code span.do { color: #ba2121; font-style: italic; } /* Documentation */
  code span.dt { color: #902000; } /* DataType */
  code span.dv { color: #40a070; } /* DecVal */
  code span.er { color: #ff0000; font-weight: bold; } /* Error */
  code span.fl { color: #40a070; } /* Float */
  code span.fu { color: #06287e; } /* Function */
  code span.im { color: #008000; font-weight: bold; } /* Import */
  code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
  code span.kw { color: #00338a; font-weight: bold; } /* Keyword */
  code span.op { color: #666666; } /* Operator */
  code span.ot { color: #007020; } /* Other */
  code span.pp { color: #bc7a00; } /* Preprocessor */
  code span.sc { color: #4070a0; } /* SpecialChar */
  code span.ss { color: #bb6688; } /* SpecialString */
  code span.st { color: #4070a0; } /* String */
  code span.va { color: #201f45; } /* Variable */
  code span.vs { color: #4070a0; } /* VerbatimString */
  code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
  .display.math{display: block; text-align: center; margin: 0.5rem auto;}
  </style>
</head>
<body>
<nav id="TOC" role="doc-toc">
<h2 id="toc-title">Contents</h2>

</nav>
<h1 id="controlling-behavioural-tasks-using-state-machines">Controlling
Behavioural Tasks using State Machines</h1>
<p>Any experiment can be thought of as a series of states (delay period,
initiate fixation, present stimulus, give subject feedback, post-trial
timeout, etc.) and conditions for switching between these states. State
Machines are a widely used control system for these types of scenarios.
The important definition of a state machine is:</p>
<ol type="1">
<li>The state machine must be in exactly one of a finite number of
states at any given time. States run for a defined amount of time by
default before switching to a <code>next</code> state.</li>
<li>The state machine cal also change from one state to another based on
rules; the conditional change from one state to another is called a
<strong>transition</strong>. A function controls the transition
(<code>transitionFcn</code>), returning a different state name that
forces a transition to this new state.</li>
<li>Functions can run when we <strong>enter</strong>
(<code>enterFcn</code>), are <strong>within</strong>
(<code>withinFcn</code>), or <strong>exit</strong>
(<code>exitFcn</code>) a state.</li>
</ol>
<p>Opticka defines all of this in a <code>StateInfo.m</code> file that
specifies function arrays and assigns them to a state list. The Opticka
GUI visualises the state table and lists out each function array.</p>
<p>For example this cell array identifies two functions which draw and
animate our <code>stims</code> stimulus object. The <code>@()</code>
identifies these as MATLAB function handles:</p>
<div class="sourceCode" id="cb1"><pre
class="sourceCode matlab"><code class="sourceCode matlab"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a>{ <span class="op">@</span>()<span class="va">draw</span>(<span class="va">stims</span>)<span class="op">;</span> <span class="op">@</span>()<span class="va">animate</span>(<span class="va">stims</span>)<span class="op">;</span> }</span></code></pre></div>
<p>Opticka has many core functions that can run during state machine
traversal. You can additionally write your own functions and store them
in a <a href="uihelpfunctions.html">userFunctions.m</a> class file.</p>
<p>As an example, the <code>DefaultStateInfo.m</code> file defines
several experiment states (<em>prefix</em>, <em>fixate</em>,
<em>stimulus</em>, <em>incorrect</em>, <em>breakfix</em>,
<em>correct</em>, <em>timeout</em>) and how the task switches between
them (either with a timer or transitioned using an eyetracker):</p>
<pre class="smaller"><code>                                                       ┌───────────────────┐
                                                       │      prefix       │
  ┌──────────────────────────────────────────────────▶ │    hide(stims)    │ ◀┐
  │                                                    └───────────────────┘  │
  │                                                      │                    │
  │                                                      ▼                    │
  │                         ┌───────────┐  inFixFcn:   ┌───────────────────┐  │
  │                         │ incorrect │  incorrect   │      fixate       │  │
  │                         │           │ ◀─────────── │   show(stims,2)   │  │
  │ reward!                 └───────────┘              └───────────────────┘  │
  │                           │                          │ inFixFcn:          │
  │                           │                          │ stimulus           │
  │                           │                          ▼                    │
┌─────────┐  maintainFixFcn:  │                        ┌───────────────────┐  │
│ correct │  correct          │                        │     stimulus      │  │
│         │ ◀─────────────────┼─────────────────────── │ show(stims,[1 2]) │  │
└─────────┘                   │                        └───────────────────┘  │
                              │                          │ maintainFixFcn:    │
                              │                          │ breakfix           │
                              │                          ▼                    │
                              │                        ┌───────────────────┐  │
                              │                        │     breakfix      │  │
                              │                        └───────────────────┘  │
                              │                          │                    │
                              │                          ▼                    │
                              │                        ┌───────────────────┐  │
                              │                        │      timeout      │  │
                              └──────────────────────▶ │      tS.tOut      │ ─┘
                                                       └───────────────────┘</code></pre>
<p>State info files, being plain <code>.m</code> files, should be edited
in the MATLAB editor (the GUI has an edit button that opens the file in
the editor for you).</p>
<hr />
<!--
digraph{
    prefix[label="prefix\nhide(stims)"];
    fixate[label="fixate\nshow(stims,2)"];
    stimulus[label="stimulus\nshow(stims,[1 2])"];
    prefix -> fixate;
    fixate -> stimulus[label="inFixFcn:\nstimulus"];
    fixate -> incorrect[label="inFixFcn:\nincorrect"];
    stimulus -> correct[label="maintainFixFcn:\ncorrect"];
    stimulus -> breakfix[label="maintainFixFcn:\nbreakfix"];;
    correct -> prefix [label="rewarded"];
    breakfix -> timeout;
    incorrect -> timeout;
    timeout -> prefix;
} -->
</body>
</html>
